#include <iostream>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <cstring>


typedef struct{
    long mtype;
    char mtext[1024];
}MSG_BUF;

int main(){
    key_t key=ftok("./msgclient.cc",0x6666);
    if(key<0){
        perror("ftok error");
        exit(1);
    }
    // 当msgget的第二个参数为IPC_CREAT | IPC_EXCL时，如果消息队列已经存在，则返回-1，并设置errno为EEXIST
    // 当msgget的第二个参数为IPC_CREAT | 0666时，如果消息队列已经存在，则返回消息队列的id，并设置errno为0
    int msgid=msgget(key,IPC_CREAT | 0666);
    if(msgid<0){
        perror("msgget error");
        exit(2);
    }
    
    MSG_BUF msg;
    msg.mtype=1;
    while(1){
        printf("Client: Enter message: ");
        fflush(stdout);
        //如果不清空缓冲区的话会造成读取端读到的内容太多而报错
        memset(msg.mtext,0,sizeof(msg.mtext));

        fgets(msg.mtext,sizeof(msg.mtext)-1,stdin);
        
        int ret=msgsnd(msgid,&msg,strlen(msg.mtext),0);
        if(ret<0){
            perror("msgsnd error");
            exit(3);
        }
        if(strcmp(msg.mtext,"quit\n")==0){
            break;
        }
        sleep(1);
    }
    
    return 0;
}